home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / lib / yotpin / src / xbmsave.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-20  |  3.5 KB  |  188 lines

  1. /*
  2. *    Yamana's Otomeza Plug-in Tool
  3. *        Xwindow Bit Map セーバ
  4. *    
  5. *    1995.08.07    
  6. *    1995.08.12    異常な遅さを誇っていたので一気に5倍程度高速化した
  7. *    
  8. */
  9.  
  10. #include    "otome_pi.h"
  11.  
  12. const char    longname[]    = "FILE  : XBM saver";
  13. const char    extend[]    = "XBM";
  14.  
  15. #define        USE_FILE    PI_SAVE
  16. #include    "otome_pi.c"
  17.  
  18.  
  19. char    *readbuf,*buf;
  20. char    *bufp;
  21.  
  22. /*************************************************************************/
  23.  
  24. #define    COLUMN    12
  25. #define    TMPSIZE    (Width*7)    /* これくらいで大丈夫のはずなんだが… */
  26.  
  27. #define    to16a(c)    (( (c)<0x0a ) ? (c)+'0': (c)-0x0a+'a' )
  28.  
  29. int XBM_write( wbuf, Width, fp )
  30. char    *wbuf;
  31. int     Width;
  32. FILE    *fp;
  33. {
  34.     static unsigned int    column=0;
  35.     int     i,p;
  36.     char    *tmp = wbuf+Width;
  37.     
  38.     for( i=0,p=0; i<Width ; i++,column++ )
  39.     {    
  40.         if( column>0 )
  41.             tmp[ p++ ] = ',';
  42.         if( (column % COLUMN)==0 )
  43.             strcpy( tmp+p, "\r\n " ),p+=3;
  44.         
  45.         strcpy( tmp+p, " 0x" ),p+=3;
  46.         tmp[ p++ ] = to16a( wbuf[i] >>4 );
  47.         tmp[ p++ ] = to16a( wbuf[i] & 0xf);
  48.     }
  49.     if( fwrite( tmp, 1, p, fp ) == p )
  50.         return NOERR;
  51.     else
  52.         return ERROR;
  53.     
  54. }
  55.  
  56. /***********************/
  57.  
  58. int vramWidth;
  59.  
  60. int getcol16(image,x,y)
  61. char    *image;
  62. int     x,y;
  63. {    
  64.     return (image[ (x>>1) + y*vramWidth ] >> ((x & 1)? 4:0))& 0x0f ;
  65. }
  66.  
  67. int getcol256(image,x,y)
  68. char    *image;
  69. int     x,y;
  70. {    
  71.     return (image[ x + y*vramWidth ] );
  72. }
  73.  
  74. int XBM_writeData( image, col, pix, size, name, fp )
  75. char    *image,*name;
  76. int     col,pix;
  77. POINT    *size;
  78. FILE    *fp;
  79. {
  80.     int     Bit[] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
  81.     int     x,y;
  82.     int     Width,realWidth;
  83.     int     (*getcol)();
  84.     char    *wbuf;
  85.     
  86.     fputs( "static char "    ,fp );
  87.     fputs(  name            ,fp );
  88.     fputs( "_bits[] = {"    ,fp );
  89.     
  90.     
  91.     /* 乙女座からは32ドット単位で渡される */
  92.     vramWidth = (size->x+31)& 0xffe0 ;
  93.     realWidth = (size->x+ 7)& 0xfff8 ;    /* しかし記録は 8ビット単位 */
  94.     
  95.     if( pix==4 )
  96.     {    vramWidth >>= 1;
  97.         getcol = getcol16;
  98.     }else
  99.         getcol = getcol256;
  100.     
  101.     Width = realWidth>>3;
  102.     
  103.     if( (wbuf=PI_MALLOC( Width+ TMPSIZE ))==NULL )    return PI_ERROR_NO_MEMORY;
  104.     
  105.     for( y=0; y<size->y ; y++ )
  106.     {
  107.         for( x=0; x< Width; x++ )
  108.             wbuf[x] = 0;
  109.         
  110.         for( x=0; x<realWidth ; x++ )
  111.         {    if( getcol(image,x,y) == col )
  112.                 wbuf[ x>>3 ] |= Bit[x & 7];
  113.         }
  114.         
  115.         if( XBM_write( wbuf, Width, fp ) )
  116.             return ERROR;
  117.         
  118.     }
  119.     
  120.     fputs( "};\r\n", fp );
  121.     PI_FREE( wbuf );
  122.     
  123.     return NOERR;
  124. }
  125.  
  126.  
  127. /***********************/
  128.  
  129. void del_ext( name, str )
  130. char    *name,*str;
  131. {
  132.     for( ; *str!='\0' && *str!='.' ; name++,str++ )
  133.         *name = ((*str>='A' && *str<='Z') ? (*str+' ') : *str );
  134.     *name = '\0';
  135. }
  136.  
  137. int XBM_writeSize( size, name,fp )
  138. POINT    *size;
  139. char    *name;
  140. FILE    *fp;
  141. {
  142.     char    tmp[8];
  143.     
  144.     /* ディスクが一杯とかいろいろ...最初だけチェックすれば大丈夫 */
  145.     if( fputs( "#define ",fp ) )    return ERROR;
  146.     fputs(  name        ,fp );
  147.     fputs( "_width "    ,fp );
  148.     itoa( size->x, tmp, 10 );fputs( tmp, fp );
  149.     fputs( "\r\n"        ,fp );
  150.     
  151.     fputs( "#define "    ,fp );
  152.     fputs(  name        ,fp );
  153.     fputs( "_height "    ,fp );
  154.     itoa( size->y, tmp, 10 );fputs( tmp, fp );
  155.     fputs( "\r\n"        ,fp );
  156.     
  157.     return NOERR;
  158. }
  159.  
  160. /***********************/
  161.  
  162.  
  163. int APL_exec()
  164. {
  165.     FILE    *fp;
  166.     char    name[16];
  167.     int     ret;
  168.     
  169.     if( pi_imge->pix >8 )    return ERROR;
  170.     
  171.     if( (fp = fopen( PI_FNAME, "wb" )) == NULL )
  172.         return PI_ERROR_FILE_OPEN;
  173.     
  174.     del_ext( name, PI_FNAME );
  175.     XBM_writeSize(  &pi_imge->size, name, fp );
  176.     
  177. //    printf("color = %d",PI_FORECOL );    /* V1.3b じゃ得られないんだね */
  178.     
  179.     ret = XBM_writeData( pi_imge->image, PI_FORECOL, pi_imge->pix,
  180.                     &pi_imge->size, name, fp );
  181.     
  182.     fclose( fp );
  183.     if( ret )    remove( PI_FNAME );
  184.     
  185.     return ret;
  186. }
  187.  
  188.